// ==UserScript==
// @name           meneame signature
// @namespace      http://javierperez.eu
// @description    Adjunta tu firma a los comentarios en menéame
// @include        http://meneame.net/story/*
// @include        http://meneame.dev/story/*
// ==/UserScript==

// Configuración depurador
if (!(console && console.log)) console = {log:function(){}};

// Obtenemos nuestra firma
var ms_cookie = 'meneame_signature';
var signature = readCookie();
if (!signature) setSignature('');

// Buscamos el FORM de envío de comentario (div.commentform)
// NOTA: en jQuery sería $('div.commentform > form')

// - obtenemos todos los div's
var divs = unsafeWindow.document.getElementsByTagName('div');
// - buscamos el div con className = 'commentform'
//		y obtenemos el form
var f = null;
for (var i=0; i<divs.length && !(f=divs[i].className=='commentform'?divs[i].getElementsByTagName('form')[0]:null); i++);
if (f) {
	// - añadimos evento onsubmit
	f.onsubmit = function(){
		this.comment_content.value = this.comment_content.value + getSignature();
		return true;
	};
	// - añadimos mensaje de "meneame signature loaded"
	var d = unsafeWindow.document.createElement('div');
//	d.innerHTML = '<b>menéame signature</b> loaded! | <a href="#" onclick="setSignature(); return false;" style="color:#a00;">Editar firma</a> <a href="#" onclick="deleteSignature(); return false;">Eliminar firma</a>';
	d.innerHTML = '<textarea></textarea>';
	f.comment_content.parentNode.appendChild(d);
}

// Añadimos una capa donde mostrar el comentario que estamos escribiendo, tal y
//	como se vería publicado en menéame

// - hay que buscar el contenedor de comentarios: ol.comments-list
var comments = searchClassed('ol','comments-list');
if (comments && comments.length) {
	// - encontramos nuestro contenedor de comentarios
	comments = comments[0];
} else {
	// - no encontramos el contenedor, creamos uno
	// TODO: ...
	console.log('ERROR: sin contenedor');
}

// - se crea una entrada nueva (LI)
var comment = newElement('li', comments);
var c_body = newElement('div', comment);

c_body.className = 'comment-body';
c_body.innerHTML = '<a href="#comment-preview"><strong>#preview</strong></a> '
	+ '<span id="comment-preview"></span>';

// - obtenemos id del contenedor del comentario
var preview = getElement('comment-preview');

// Añadimos evento onkeyup al textarea del comentario
f.comment_content.onkeyup = function() {
	writePreview(this.value);
};
writePreview(f.comment_content.value);

// Funciones preview -----------------------------------------------------------
// - escribe el comentario en la preview
function writePreview(text) {
	preview.innerHTML = (text + getSignature()).split('\n').join('<br />');
}
// - obtiene el texto de la firma
function getSignature() {
	return '\n\n---\n' + signature;
}

// Funciones DOM ---------------------------------------------------------------
// - obtiene elementos del tipo div.className
function searchClassed(tag, classname) {
	var els = unsafeWindow.document.getElementsByTagName(tag);
	var e = [];
	for (var i=0; i<els.length; i++)
		 if (els[i].className==classname) e.push(els[i]);
	return e;
}
// - crear un elemento
function newElement(tag, appendTo) {
	var e = unsafeWindow.document.createElement(tag);
	if (appendTo) appendTo.appendChild(e);
	return e;
}
// - obtener un elemento por id
function getElement(id) {
	return unsafeWindow.document.getElementById(id);
}

// Funciones para cookies
// @link http://www.quirksmode.org/js/cookies.html

// Pregunta por una firma mediante ventana modal
function setSignature(old) {
	var n = prompt('Nueva firma:', old||signature);
	if (n) {
		signature = n;
		unsafeWindow.document.cookie = ms_cookie+'='+encodeURIComponent(n)+'; path=/';
	}
}
unsafeWindow.setSignature = setSignature;

// Lee la cookie con nuestra firma
function readCookie() {
	var nameEQ = ms_cookie + "=";
	var ca = unsafeWindow.document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return decodeURIComponent(c.substring(nameEQ.length,c.length));
	}
	return null;
}

// Elimina la cookie
unsafeWindow.deleteSignature = function() {
	unsafeWindow.document.cookie = ms_cookie+"=; path=/";
	signature = null;
	alert('Firma eliminada');
};
